package Day_0222.Spring;

/**
 * @author zxc
 * @date 2023/02/22 14:47
 **/
public class Spring_DesignContainer {
    public static void main(String[] args) {
        /**
         * Spring设计容器的原理 && BeanFactory和ApplicationContext的关系详解
         * ===》
         * 1.设计了两个接口用以表示容器。
         * 1）BeanFactory
         *  BeanFactory 简单粗暴，可以理解为就是个 HashMap，Key 是 BeanName，Value 是 Bean 实例。
         *  BeanFactory通常只提供注册（put），获取（get）这两个功能。我们可以称之为 “低级容器”。
         *
         * 2）ApplicationContext
         *  ApplicationContext 可以称之为 “高级容器”。
         *  因为比 BeanFactory 多了更多的功能。继承了多个接口。因此具备了更多的功能。
         *  例如资源的获取，支持多种消息（例如 JSP tag 的支持），对BeanFactory 多了工具级别的支持等待。
         *  ===》
         *  所以你看它的名字，已经不是 BeanFactory 之类的工厂了，而是 “应用上下文”， 代表着整个大容器的所有功能。
         *  该接口定义了一个 refresh 方法，此方法是 用于刷新整个容器，即重新加载/刷新所有的 bean。
         *
         * 2.高级容器ApplicationContext和低级容器BeanFactory之间的联系和区别
         * （1）最上面的是 BeanFactory接口，后续接口都是功能扩展接口。
         * （2）隶属 ApplicationContext 粉红色的 “高级容器”，依赖着 “低级容器”，这里说的是依赖，不是继承哦。
         *  依赖着 “低级容器” 的 getBean 功能。
         *  而高级容器有更多的功能：支持不同的信息源头，可以访问文件资源，支持应用事件（Observer 模式）。
         * （3）左边灰色区域的是 “低级容器”， 只负责加载 Bean，获取 Bean。
         *  容器其他的高级功能是没有的。
         *  例如，refresh 刷新 Bean 工厂所有配置，生命周期事件回调等。
         *
         * 3.小结
         * IoC（控制反转）的实现，只需要低级容器就可以实现，2 个步骤：
         * （1） 加载配置文件，解析成 BeanDefinition 放在 Map 里。
         * （2）调用 getBean 的时候，从 BeanDefinition 所属的 Map 里，拿出 Class 对象进行实例化，
         * 同时，如果有依赖关系，将递归调用 getBean 方法 —— 完成依赖注入。
         * ===》
         * 上面就是 Spring 低级容器（BeanFactory）的 IoC。
         *
         * （3）高级容器 ApplicationContext，包含了低级容器的功能。一句话，他不仅仅是 IoC。
         *  他支持不同信息源头，支持 BeanFactory 工具类，支持层级容器，支持访问文件资源，支持事件发布通知，支持接口回调等等。
         *
         */
    }
}
